package com.ruoyi.framework.shiro.service;

import com.ruoyi.common.constant.ShiroConstants;
import com.ruoyi.common.utils.StringUtils;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/*
 *@title SysTokenService
 *@description API Token服务类,完成对API请求的Token缓存管理
 *@author wanghaohao
 *@version 1.0
 *@create 2025-10-22 12:00
 */
@Component
public class SysTokenService {
    @Autowired
    private CacheManager cacheManager;

    private Cache<String, String> apiTokenCache;

    @PostConstruct
    public void init() {
        apiTokenCache = cacheManager.getCache(ShiroConstants.API_TOKEN_CACHE);
    }

    public void addApiToken(String username, String token) {
        apiTokenCache.put(username, token);
    }

    public String getApiToken(String username) {
        return apiTokenCache.get(username);
    }

    public void removeApiToken(String username) {
        apiTokenCache.remove(username);
    }

    /**
     * 检查指定Token是否存在于缓存中
     *
     * @param token 待检查的Token字符串
     * @return true：存在；false：不存在或Token为空
     */
    public boolean existsApiToken(String token) {
        // 若Token为空，直接返回不存在
        if (StringUtils.isEmpty(token)) {
            return false;
        }
        // 遍历缓存中所有用户名对应的Token，比对是否存在目标Token
        for (String username : apiTokenCache.keys()) {
            String storedToken = apiTokenCache.get(username);
            if (token.equals(storedToken)) {
                return true; // 找到匹配的Token，返回存在
            }
        }
        return false; // 遍历完所有缓存项，未找到匹配Token
    }

    /**
     * 主方法用于测试各功能
     */
    public static void main(String[] args) {
        // 创建测试实例
        SysTokenService tokenService = new SysTokenService();

        // 测试添加和获取Token
        String username = "testUser";
        String token = "testToken123456";
        tokenService.addApiToken(username, token);
        System.out.println("添加Token后获取: " + tokenService.getApiToken(username));

        // 测试Token存在性检查
        System.out.println("Token是否存在: " + tokenService.existsApiToken(token));

        // 测试删除Token
        tokenService.removeApiToken(username);
        System.out.println("删除Token后获取: " + tokenService.getApiToken(username));
        System.out.println("删除后Token是否存在: " + tokenService.existsApiToken(token));
    }
}
